#!/bin/bash

## 变量定义
mstack_script_dir=$(dirname "$(realpath "${BASH_SOURCE[0]}")")
source $mstack_script_dir/common_variables.sh


function transfer_packages1() {
    echo -e "${BLUE}正在传输 OpenStack 软件包到 $ip 的 $mstack_packet_docker_images 目录${NC}"

    ssh "$ip" "mkdir -p $mstack_packet_docker_images"
    rsync -avz $mstack_packet_docker_images/ $ip:$mstack_packet_docker_images/
    ssh "$ip" sync; echo 1 > /proc/sys/vm/drop_caches
}

function check_source_file1() {
    for tar_file in $mstack_packet_docker_images/*.tar; do
        # 提取镜像 ID (文件名的第一部分)
        image_id=$(basename "$tar_file" | cut -d'_' -f1)

        # 检查是否已经存在该镜像
        if ! ssh "$ip" docker images --format "{{.ID}}" | grep -q "$image_id"; then
            # 如果镜像不存在，则导入
            echo "导入镜像：$tar_file"
            echo -e "${BLUE}导入镜像：$tar_file 到 $name...${NC}"
            ssh "$ip" docker image load -i "$tar_file"
        else
            echo -e "${GREEN}$name 镜像 $tar_file 已经存在，跳过导入。${NC}"
        fi
    done
}

function shell_concurrent_template() {
    MAX_CONCURRENT=15  # 定义最大并发数
    TMP_FIFO="/tmp/$$.fifo"

    # 初始化并发控制器
    mkfifo $TMP_FIFO
    exec 5<>$TMP_FIFO
    rm -f $TMP_FIFO
    for ((i=0;i<$MAX_CONCURRENT;i++)); do
        echo >&5
    done

    for ip in $(awk '{print $1}' $mstack_tools_mstack_dir/mstack_all_nodes.txt | sed -r '/^[ \t]*($|#)/d'); do
        name=$(grep "$ip" $mstack_tools_mstack_dir/mstack_all_nodes.txt| awk '{print $2}' | sed -r '/^[ \t]*($|#)/d')
        read -u5  # 获取令牌

        {  # 后台任务块开始
            transfer_packages1
            check_source_file1


            echo >&5  # 归还令牌
        } &  # 后台执行
    done

    wait  # 等待所有后台任务
    exec 5>&-  # 关闭描述符
}

shell_concurrent_template










# 函数: 传输软件包到目标主机
transfer_packages() {
    echo -e "${BLUE}正在传输 OpenStack 软件包到 $ip 的 $mstack_packet_docker_images 目录${NC}"

    ssh "$ip" "mkdir -p $mstack_packet_docker_images"
    rsync -avz $mstack_packet_docker_images/ $ip:$mstack_packet_docker_images/
    ssh "$ip" sync; echo 1 > /proc/sys/vm/drop_caches
    echo
}

function check_source_file() {

    # 获取/opt/images目录下所有tar文件
    for tar_file in $mstack_packet_docker_images/*.tar; do
        # 提取镜像 ID (文件名的第一部分)
        image_id=$(basename "$tar_file" | cut -d'_' -f1)

        # 检查是否已经存在该镜像
        if ! ssh "$ip" docker images --format "{{.ID}}" | grep -q "$image_id"; then
            # 如果镜像不存在，则导入
            echo "导入镜像：$tar_file"
            echo -e "${BLUE}导入镜像：$tar_file 到 $name...${NC}"
            ssh "$ip" docker image load -i "$tar_file"
        else
            echo -e "${GREEN}$name 镜像 $tar_file 已经存在，跳过导入。${NC}"
        fi
    done
}


## 同步镜像文件到远程主机
function slave_add_key() {
    for ip in $(awk '{print $1}' $mstack_tools_mstack_dir/mstack_all_nodes.txt | sed -r '/^[ \t]*($|#)/d'); do
        # 通过 grep 获取对应的主机名
        name=$(grep "$ip" $mstack_tools_mstack_dir/mstack_all_nodes.txt| awk '{print $2}' | sed -r '/^[ \t]*($|#)/d')

        # 同步镜像文件到远程主机
        transfer_packages

        # 检查远程目录是否存在
        echo -e "${BLUE}上传镜像 $hostname ($ip)...${NC}"
        check_source_file
    done
}


slave_add_key




# 函数: 传输软件包到目标主机
transfer_packages() {
    for ip in $(awk '{print $1}' $mstack_tools_mstack_dir/mstack_all_nodes.txt | sed -r '/^[ \t]*($|#)/d'); do
        # 通过 grep 获取对应的主机名
        name=$(grep "$ip" $mstack_tools_mstack_dir/mstack_all_nodes.txt| awk '{print $2}' | sed -r '/^[ \t]*($|#)/d')

        echo -e "${BLUE}正在传输 OpenStack 软件包到 $ip 的 $mstack_packet_docker_images 目录${NC}"

        ssh "$ip" "mkdir -p $mstack_packet_docker_images"
        rsync -avz $mstack_packet_docker_images/ $ip:$mstack_packet_docker_images/
        ssh "$ip" sync; echo 1 > /proc/sys/vm/drop_caches
        echo
    done
}